package org.atlantis.grosbeak.depot;

/**
 * IOC容器的总接口。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 */
public interface Depot {

	/**
	 * 从指定的环境中获取指定类型、ID的对象。
	 * 
	 * @param type
	 *            要获取的对象的类型。
	 * @param id
	 *            对象在容器中的ID。
	 * @param env
	 *            容器的环境。
	 * @return 获取到的对象。
	 * @throws DepotException
	 */
	<T> T get(Class<T> type, String id, DepotEnv env) throws DepotException;

	/**
	 * 从容器中获取一个指定类型、ID的对象。
	 * 
	 * @param type
	 *            要获取的对象的类型。
	 * @param id
	 *            对象在容器中的ID。
	 * @return 获取到的对象。
	 * @throws DepotException
	 */
	<T> T get(Class<T> type, String id) throws DepotException;

	/**
	 * 从容器中获取一个指定ID的对象的类型。
	 * 
	 * @param id
	 *            指定的ID
	 * @return 在容器中指定ID的对象的类型。
	 * @throws DepotException
	 */
	Class<?> getType(String id) throws DepotException;

	/**
	 * 判断容器中是否存在指定ID的对象。
	 * 
	 * @param id
	 *            指定的ID。
	 * @return 容器中如果存在对应指定ID的对象则返回true，否则返回false。
	 * @throws DepotException
	 */
	boolean has(String id) throws DepotException;

	/**
	 * 获取容器中所有对象的ID。
	 * 
	 * @return 容器中所有对象的ID数组。
	 */
	String[] ids();

	/**
	 * 重置容器，把容器恢复到刚创建的状态。
	 */
	void reset();

	/**
	 * 销毁容器，销毁后的容器是不能再使用的。
	 */
	void destroy();
}
